Материалы к урокам 7 класса



Урок 31
Исполнитель Робот
Цикл «пока»
Работа в среде «Алгоритмика»














Цикл «пока»


А теперь попробуем написать программу для решения очень простой задачи: закрасить все клетки справа от Робота (рис. 3.13).

image

Рис. 3.13

Правда, сколько именно клеток следует закрасить, не уточнено. Известно только, что:
1) справа на неизвестном расстоянии есть стена;
2) клетки нужно красить, пока Робот не подойдет к стене вплотную.

Воспользуемся тем, что Робот может анализировать и сообщать обстановку вокруг себя, проверяя следующие простые условия:


справа свободно
слева свободно 
сверху свободно 
снизу свободно 
закрашено

Ясно, что пока будет выполняться условие справа свободно, нужно выполнять команды:


вправо 
закрась

Для оформления таких последовательностей действий используется специальная конструкция алгоритмического языка — цикл «пока».

ПОКА справа свободно ДЕЛАТЬ 
	вправо 
	закрась 
КОНЕЦ

В общем виде цикл «пока» записывается так:

ПОКА <условие> ДЕЛАТЬ
	<тело цикла (последовательность команд)>
КОНЕЦ

Блок-схема цикла «пока» имеет вид, показанный на рис. 3.14.

image

Рис. 3.14

При выполнении этого цикла исполнитель повторяет следующие действия:
1) проверяет записанное после служебного слова ПОКА условие;
2) если условие не соблюдается (Робот ответил «Нет»), то выполнение цикла прекращается, и Робот начинает выполнять команды, записанные после служебного слова КОНЕЦ. Если же условие соблюдается (Робот ответил «Да»), то Робот выполняет тело цикла и снова проверяет условие.

Напишем программу, исполняя которую Робот нарисует на клетчатом поле меандр (рис. 3.12), число витков которого зависит от положения правой стены.

Виток меандра умещается на клетчатом поле, если между клеткой, занимаемой Роботом, и правой стеной есть 1 клетка.

ПОКА справа свободно ДЕЛАТЬ
	вправо
	закрась; влево 
	закрась; влево 
	закрась; вверх 
	закрась; вверх 
	закрась; вправо; закрась 
	вправо; вправо; вправо 
	вниз; вниз 
КОНЕЦ

В зависимости от исходного положения Робота тело цикла пока может не выполниться ни разу. Такая ситуация не является отказом.

♦ Подумайте, каким должно быть исходное положение Робота в программе рисования меандра, чтобы тело цикла не выполнилось ни разу.

Из-за логических ошибок, допущенных при составлении алгоритма, может возникнуть ситуация зацикливания. Это значит, что условие будет всегда соблюдаться, и выполнение цикла «пока» никогда не завершится.

Рассмотрим следующий пример:

ПОКА справа свободно ДЕЛАТЬ
	вправо; влево 
КОНЕЦ

♦ Что будет происходить, если справа от Робота нет стены?

Условие в цикле «пока» проверяется только перед выполнением тела цикла, но не в процессе его выполнения.

♦ Подумайте, что произойдет, если Робот начнет выполнять нашу программу рисования меандра с циклом «пока», находясь в следующем исходном положении:

image

♦ Что общего у циклов «повторить п раз» и «пока»? Какие между ними отличия? Нужны ли две конструкции для описания повторяющихся действий?

Простые и составные условия


В цикле «пока» могут использоваться не только простые, но и составные условия.

Составное условие образуется из одного или несколь¬ких простых условий и служебных слов И, ИЛИ, НЕ.

Рассмотрим составное условие А И В, где А, В — простые условия. Условие А И В выполнено, когда выполнено каждое из двух входящих в него простых условий.

Пусть А — простое условие сверху свободно, В — простое условие справа свободно. Рассмотрим подробно проверку составного условия А ИВ — сверху свободно и справа свободно

image

(рис. 3.15).

В случае а выполнено условие А (сверху свободно), выполнено условие В (справа свободно). Составное условие А И В(сверху свободно И справа свободно)также выполнено.

В случае б выполнено условие А, условие В не выполнено. Составное условие А И В не выполнено.

В случае в не выполнено условие А, условие В выполнено. Составное условие А И В не выполнено.

В случае г не выполнено условие А, не выполнено условие В. Составное условие А И В не выполнено.

♦ Нужно ли проверять условие В в составном условии АИВ, если условие А не выполнено?

Составное условие А ИЛИ В выполнено, когда выполнено хотя бы одно из двух входящих в него простых условий.

Рассмотрим проверку составного условия А ИЛИ В — сверху свободно ИЛИ справа свободно (см. рис. 3.15).

В случае а выполнено условие А (сверху свободно), выполнено условие В (справа свободно). Составное условие А ИЛИ В (сверху свободно ИЛИ справа свободно) выполнено.

В случае б выполнено условие А, не выполнено условие В. Составное условие А ИЛИ В выполнено.

В случае в не выполнено условие А, выполнено условие В. Составное условие А ИЛИ В выполнено.

В случае г не выполнено условие А, не выполнено условие В. Составное условие А ИЛИ В не выполнено.

♦ Нужно ли проверять условие В в составном условии А ИЛИ В, если условие А выполнено?

Составное условие НЕ А выполнено, когда не выполнено условие А.

Пусть А — простое условие закрашено. Рассмотрим проверку составного условия НЕ А (рис. 3.16).

image

рис. 3.16

В случае а условие А выполнено, условие НЕ А (НЕ закрашено) не выполнено.

В случае б условие А не выполнено, условие НЕ А (НЕ закрашено) выполнено.

Рассмотрим пример использования составного условия.

image

Известно, что Робот находится где-то в вертикальном коридоре. Ни одна из клеток коридора не закрашена.

Составим алгоритм, под управлением которого Робот закрасит все клетки этого коридора и вернется в исходное положение.

Так как Роботу предстоит закрасить только клетки коридора, мы должны «научить» его их распознавать. Чем же клетки коридора отличаются от всех прочих клеток поля? Из рис. 3.17 видно, что каждая клетка коридора слева и справа ограничена стеной.

Робот находится в коридоре, пока слева стена и справа стена. В СКИ нашего исполнителя такие условия не предусмотрены. Там есть противоположные условия: слева свободно, справа свободно. Используем служебное слово НЕ:

	слева стена → НЕ слева свободно 
	справа стена → НЕ справа свободно 
		Нужное условие примет вид:
	НЕ слева свободно И НЕ справа свободно. 

Представим план действий Робота укрупненными шагами (рис. 3.18):

image

рис. 3.18

Для простоты предположим, что над коридором и под коридором есть хотя бы по одной клетке без стен (иначе придется делать дополнительные проверки сверху свободно, снизу свободно).

1. Чтобы закрасить все клетки коридора, находящиеся выше Робота, прикажем Роботу шагнуть вверх и выполним цикл «пока»:

вверх
ПОКА НЕ слева свободно И НЕ справа свободно ДЕЛАТЬ
	закрась 
	вверх 
КОНЕЦ

Под управлением этого алгоритма Робот закрасит все клетки коридора, находящиеся выше от него, и окажется на клетке рядом с верхней границей коридора.

♦ При каком исходном положении Робота этот цикл не выполнится ни разу?

2. Командой вниз вернем Робота в коридор. Наша задача — вернуть его в исходную точку. Эта точка имеет единственный отличительный признак — она не закрашена. Поэтому пока занимаемая Роботом клетка оказывается закрашенной, будем перемещать его вниз:

вниз
ПОКА закрашено ДЕЛАТЬ
	вниз 
КОНЕЦ

Под управлением этого алгоритма Робот окажется в исходной клетке.

3. Выполнив команду вниз, Робот пройдет исходную клетку и займет первую клетку, расположенную ниже исходной. Теперь можно закрашивать клетки коридора, расположенные ниже исходной:

вниз
ПОКА НЕ слева свободно И НЕ справа свободно 
ДЕЛАТЬ
	закрась 
	вниз
КОНЕЦ

♦ Возможна ли ситуация, что этот цикл не выполнится ни разу?

4. Так как, выполнив предыдущий алгоритм, Робот окажется под коридором, командой вверх вернем его в коридор. Возвращение в исходную точку обеспечивается алгоритмом:

вверх
ПОКА закрашено ДЕЛАТЬ
	вверх 
КОНЕЦ

5. По команде закрась Робот закрашивает исходную точку.

Полностью программа управления Роботом выглядит так:

вверх
ПОКА НЕ слева свободно И НЕ справа свободно 
ДЕЛАТЬ 
	закрась 
	вверх 
КОНЕЦ 
вниз
ПОКА закрашено ДЕЛАТЬ
	вниз 
КОНЕЦ
вниз
ПОКА НЕ слева свободно И НЕ справа свободно 
ДЕЛАТЬ 
	закрась 
	вниз 
КОНЕЦ 
вверх
ПОКА закрашено ДЕЛАТЬ
	вверх 
КОНЕЦ
закрась






Наверх